package nl.hu.vakantievibes.ui;

import nl.hu.vakantievibes.client.FieldVerifier;
import nl.hu.vakantievibes.domain.Reis;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.History;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.TabBar;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class ReisBoeken {

	private Reis deReis;
	private VerticalPanel pnlVTA, pnlGeb, pnlStrHNr;
	private HorizontalPanel pnlButton, pnCarpool1, pnCarpool2, pnCarpool3, pnFiets1, pnFiets2,pnFiets3, pnFiets4;
	private Label lblVoornaam, lblTussenvoegsel, lblAchternaam, lblDag, lblMaand, lblJaar, lblStraatnaam, lblHuisnummer, lblWoonplaats, lblPostcode, lblTelefoonnummer, lblEmail;
	private Label lblCarpoolJa, lblCarpoolJaB, lblCarpoolNee, lblZitplaatsen, lblZitplaatsenB, lblFietsJa, lblFietsJaB, lblFietsNee,lblFietsPlaatsen,lblFietsPlaatsenB;
	private RadioButton rbJa, rbNee, rbFietsJa, rbFietsNee;
	public TextBox txtVoornaam, txtTussenvoegsel, txtAchternaam, txtStraatnaam, txtHuisnummer, txtWoonplaats, txtPostcode, txtEmail, txtTelefoonnummer;
	private TextBox txtZitplaatsen,txtFietsPlaatsen;
	private ListBox lbDag, lbMaand, lbJaar;
	private Button b1, b2, b3, b4, b5, b6;
	private TabPanel tab1;
	TabBar tb;
	private boolean bAuto, bFiets, a, f;
	
	private Label lblVoornaamB, lblTussenvoegselB, lblAchternaamB, lblDagB, lblMaandB, lblJaarB, lblStraatnaamB, lblHuisnummerB, lblWoonplaatsB, lblPostcodeB, lblTelefoonnummerB, lblEmailB;
	private TextBox txtFietsPl, txtZitPl, txtAuto, txtFiets, txtVoornaamB, txtTussenvoegselB, txtAchternaamB, txtStraatnaamB, txtHuisnummerB, txtWoonplaatsB, txtPostcodeB, txtEmailB, txtTelefoonnummerB, txtDag, txtMaand, txtJaar;
	private VerticalPanel pnlVTAB, pnlGebB, pnlStrHNrB, pnCarpoolB;

	public ReisBoeken(Reis r) {

		deReis = r;
		bAuto = false;
		bFiets = false;
		
		pnlVTA = new VerticalPanel();
		pnlGeb = new VerticalPanel();
		pnlStrHNr = new VerticalPanel();
		pnlVTAB = new VerticalPanel();
		pnlGebB = new VerticalPanel();
		pnlStrHNrB = new VerticalPanel();
		pnCarpoolB = new VerticalPanel();
		
		pnlButton = new HorizontalPanel();
		pnCarpool1 = new HorizontalPanel();
		pnCarpool2 = new HorizontalPanel();
		pnCarpool3 = new HorizontalPanel();
		pnFiets1 = new HorizontalPanel();
		pnFiets2 = new HorizontalPanel();
		pnFiets3 = new HorizontalPanel();
		pnFiets4 = new HorizontalPanel();
		
		tab1 = new TabPanel();
		tb = tab1.getTabBar();

		lblCarpoolJa = new Label("Auto beschikbaar");
		lblCarpoolJaB = new Label("Auto beschikbaar");
		lblCarpoolNee = new Label("Geen auto beschikbaar");
		
		rbJa = new RadioButton("carpool");
		rbNee = new RadioButton("carpool");
		
		lblFietsJa = new Label("Ruimte voor fiets");
		lblFietsJaB = new Label("Ruimte voor fiets");
		lblFietsNee = new Label("Geen ruimte voor fiets");
		lblZitplaatsen = new Label("Aantal zitplaatsen: ");
		lblZitplaatsenB = new Label("Aantal zitplaatsen: ");
		lblFietsPlaatsen = new Label("Aantal fiets plaatsen:");
		lblFietsPlaatsenB = new Label("Aantal fiets plaatsen:");
		txtFietsPlaatsen = new TextBox();
		txtZitplaatsen = new TextBox();
		
		rbFietsJa = new RadioButton("fiets");
		rbFietsNee = new RadioButton("fiets");

		lblVoornaam = new Label("Voornaam");
		txtVoornaam = new TextBox();
		lblTussenvoegsel = new Label("Tussenvoegsel");
		txtTussenvoegsel = new TextBox();
		txtTussenvoegsel.setWidth("30px");
		lblAchternaam = new Label("Achternaam");
		txtAchternaam = new TextBox();

		lblVoornaamB = new Label("Voornaam:");
		lblTussenvoegselB = new Label("Tussenvoegsel:");
		lblAchternaamB = new Label("Achternaam:");
		
		
		lblDag = new Label("Geboortedatum: dag");
		lblMaand = new Label("maand");
		lblJaar = new Label("jaar");

		lblDagB = new Label("Geboortedatum: dag");
		lblMaandB = new Label("maand");
		lblJaarB = new Label("jaar");
		
		
		lbDag = new ListBox();
		lbDag.setWidth("75px");
		for(int d = 1; d <= 31; d++) {
			lbDag.addItem(d + "");
		}
		lbMaand = new ListBox();
		lbMaand.setWidth("75px");
		for(int m = 1; m <= 12; m++) {
			lbMaand.addItem(m + "");
		}
		lbJaar = new ListBox();
		lbJaar.setWidth("75px");
		for(int j = 1960; j <= 2011; j++) {
			lbJaar.addItem(j + "");
		}

		lblStraatnaam = new Label("Straatnaam");
		txtStraatnaam = new TextBox();
	
		lblHuisnummer = new Label("Huisnummer");
		txtHuisnummer = new TextBox();
		txtHuisnummer.setWidth("50px");
		txtHuisnummer.setMaxLength(7);

		lblWoonplaats = new Label("Woonplaats");
		txtWoonplaats = new TextBox();
		lblPostcode = new Label("Postcode");
		txtPostcode = new TextBox();
		txtPostcode.setMaxLength(8);

		lblTelefoonnummer = new Label("Telefoonnummer");
		txtTelefoonnummer = new TextBox();
		txtTelefoonnummer.setMaxLength(10);
		lblEmail = new Label("Email");
		txtEmail = new TextBox();
		
		lblStraatnaamB = new Label("Straatnaam");
		lblHuisnummerB = new Label("Huisnummer");
		lblWoonplaatsB = new Label("Woonplaats");
		lblPostcodeB = new Label("Postcode");
		lblTelefoonnummerB = new Label("Telefoonnummer");
		lblEmailB = new Label("Email");
		
		
	
		
		
		b1 = new Button("Volgende");
		b2 = new Button("Annuleren");
		b3 = new Button("Volgende");
		b4 = new Button("Annuleren");
		b5 = new Button("Boeken");
		b6 = new Button("Annuleren");
		
		txtVoornaam.setTabIndex(9);
		txtTussenvoegsel.setTabIndex(10);
		txtAchternaam.setTabIndex(11);	
		lbDag.setTabIndex(12);
		lbMaand.setTabIndex(13);
		lbJaar.setTabIndex(14);
		txtWoonplaats.setTabIndex(15);
		txtPostcode.setTabIndex(16);
		txtStraatnaam.setTabIndex(17);
		txtHuisnummer.setTabIndex(18);
		txtTelefoonnummer.setTabIndex(19);
		txtEmail.setTabIndex(20);
		b1.setTabIndex(21);
		b2.setTabIndex(22);

		b1.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				handleGegevens();
			}
		});
		b3.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				handleCarpool();
			}
		});
		b5.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				handleBoeking();
			}
		});
		b2.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				History.newItem("allereizen");
			}
		});
		b4.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				History.newItem("allereizen");
			}
		});
		b6.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				History.newItem("allereizen");
			}
		});
	}

	public Panel createPage() {
		HorizontalPanel hp = new HorizontalPanel();

		tab1.add(nawP(), "Persoonlijke gegevens");
		tab1.add(carpoolP(), "Carpool opties");
		tab1.add(new HorizontalPanel(), "Bevestiging");
		tab1.selectTab(0);
		tb.setTabEnabled(2, false);
		tb.setTabEnabled(1, false);

		hp.add(tab1);

		return hp;
	}
	
	private HorizontalPanel bevestigP() {
		HorizontalPanel hp = new HorizontalPanel();
		pnlVTAB.clear();
		pnlGebB.clear();
		pnlStrHNrB.clear();
		pnCarpoolB.clear();
		
		txtAchternaamB = new TextBox(); txtAchternaamB.setEnabled(false);
		txtVoornaamB = new TextBox(); txtVoornaamB.setEnabled(false);
		txtTussenvoegselB = new TextBox(); txtTussenvoegselB.setEnabled(false);
		txtTussenvoegselB.setWidth("30px");
		txtDag = new TextBox(); txtDag.setEnabled(false);
		txtMaand = new TextBox(); txtMaand.setEnabled(false);
		txtJaar = new TextBox(); txtJaar.setEnabled(false);
		txtStraatnaamB = new TextBox(); txtStraatnaamB.setEnabled(false);
		txtHuisnummerB = new TextBox();txtHuisnummerB.setEnabled(false);
		txtHuisnummerB.setWidth("50px");
		txtWoonplaatsB = new TextBox(); txtWoonplaatsB.setEnabled(false);
		txtPostcodeB = new TextBox(); txtPostcodeB.setEnabled(false);
		txtTelefoonnummerB = new TextBox(); txtTelefoonnummerB.setEnabled(false);
		txtEmailB = new TextBox(); txtEmailB.setEnabled(false);
		txtAuto = new TextBox(); txtAuto.setEnabled(false);
		txtFiets = new TextBox(); txtFiets.setEnabled(false);
		txtFietsPl = new TextBox(); txtFietsPl.setEnabled(false);
		txtZitPl = new TextBox(); txtZitPl.setEnabled(false);
		
		txtVoornaamB.setText(txtVoornaam.getValue());
		txtWoonplaatsB.setText(txtWoonplaats.getText());
		txtStraatnaamB.setText(txtStraatnaam.getText());
		txtTelefoonnummerB.setText(txtTelefoonnummer.getText());
		txtTussenvoegselB.setText(txtTussenvoegsel.getText());
		txtPostcodeB.setText(txtPostcode.getText());
		txtHuisnummerB.setText(txtHuisnummer.getText());
		txtEmailB.setText(txtEmail.getText());
		txtAchternaamB.setText(txtAchternaam.getText());
		
		txtDag.setText(lbDag.getValue(lbDag.getSelectedIndex()));
		txtMaand.setText(lbMaand.getValue(lbMaand.getSelectedIndex()));
		txtJaar.setText(lbJaar.getValue(lbJaar.getSelectedIndex()));
		
		if(rbJa.getValue()){
			txtAuto.setText("Ja");
			txtZitPl.setText(txtZitplaatsen.getValue());
		}
		if(rbNee.getValue()){
			txtAuto.setText("Nee");
			txtZitPl.setText("Geen");
			txtFiets.setText("Nee");
			txtFietsPl.setText("Geen");
		}
		
		if(rbFietsJa.getValue()){
			txtFiets.setText("Ja");
			txtFietsPl.setText(txtFietsPlaatsen.getValue());
		}
		if(rbFietsNee.getValue()){
			txtFiets.setText("Nee");
			txtFietsPl.setText("Geen");
		}
		
		
		pnlVTAB.setSpacing(5);
		pnlVTAB.add(lblVoornaamB);
		pnlVTAB.add(txtVoornaamB);
		pnlVTAB.add(lblDagB);
		pnlVTAB.add(txtDag);
		pnlVTAB.add(lblWoonplaatsB);
		pnlVTAB.add(txtWoonplaatsB);
		pnlVTAB.add(lblStraatnaamB);
		pnlVTAB.add(txtStraatnaamB);
		pnlVTAB.add(lblTelefoonnummerB);
		pnlVTAB.add(txtTelefoonnummerB);
		HorizontalPanel hpButtons = new HorizontalPanel();
		hpButtons.add(b5); hpButtons.add(b6);
		pnlVTAB.add(hpButtons);
		
		pnlGebB.setSpacing(5);
		pnlGebB.add(lblTussenvoegselB);
		pnlGebB.add(txtTussenvoegselB);
		pnlGebB.add(lblMaandB);
		pnlGebB.add(txtMaand);
		pnlGebB.add(lblPostcodeB);
		pnlGebB.add(txtPostcodeB);
		pnlGebB.add(lblHuisnummerB);
		pnlGebB.add(txtHuisnummerB);
		pnlGebB.add(lblEmailB);
		pnlGebB.add(txtEmailB);
		
		pnlStrHNrB.setSpacing(5);
		pnlStrHNrB.add(lblAchternaamB);
		pnlStrHNrB.add(txtAchternaamB);
		pnlStrHNrB.add(lblJaarB);
		pnlStrHNrB.add(txtJaar);

		pnCarpoolB.setSpacing(5);
		pnCarpoolB.add(lblCarpoolJaB);
		pnCarpoolB.add(txtAuto); txtAuto.setEnabled(false);
		pnCarpoolB.add(lblZitplaatsenB);
		pnCarpoolB.add(txtZitPl); txtZitPl.setEnabled(false);
		pnCarpoolB.add(lblFietsJaB);
		pnCarpoolB.add(txtFiets); txtFiets.setEnabled(false);
		pnCarpoolB.add(lblFietsPlaatsenB);
		pnCarpoolB.add(txtFietsPl); txtFietsPl.setEnabled(false);
		
		hp.add(pnlVTAB);
		hp.add(pnlGebB);
		hp.add(pnlStrHNrB);
		hp.add(pnCarpoolB);
		return hp;
	}

	private HorizontalPanel carpoolP() {
		HorizontalPanel hp = new HorizontalPanel();
		VerticalPanel vp = new VerticalPanel();
		rbJa.setFocus(false);
		rbNee.setFocus(false);
		
		pnCarpool1.add(lblCarpoolJa);
		pnCarpool1.add(rbJa);
		pnCarpool2.add(lblCarpoolNee);
		pnCarpool2.add(rbNee);

		vp.add(pnCarpool2);		
		vp.add(pnCarpool1);

		rbJa.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				RadioButton rb = (RadioButton) event.getSource();
				VerticalPanel vp = (VerticalPanel) rb.getParent().getParent();
				bAuto = true;
				pnFiets2.add(lblFietsJa);
				pnFiets2.add(rbFietsJa);
				pnFiets3.add(lblFietsNee);
				pnFiets3.add(rbFietsNee);
				pnFiets4.add(lblZitplaatsen);
				pnFiets4.add(txtZitplaatsen);

				vp.add(pnFiets2);
				vp.add(pnFiets3);
				vp.add(pnFiets4);
				if(rbFietsJa.getValue()){
					pnFiets1.add(lblFietsPlaatsen);
					pnFiets1.add(txtFietsPlaatsen);
					vp.add(pnFiets1);
				}
				pnCarpool3.add(b3);
				pnCarpool3.add(b4);
				vp.add(pnCarpool3);

			}
		});

		rbNee.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				RadioButton rb = (RadioButton) event.getSource();
				VerticalPanel vp = (VerticalPanel) rb.getParent().getParent();
				if(rbFietsJa.getValue()){
					vp.remove(5);
				}
				if(bAuto){
					vp.remove(4);
					vp.remove(3);
					vp.remove(2);
				}
				pnCarpool3.add(b3);
				pnCarpool3.add(b4);
				vp.add(pnCarpool3);
				
			}
		});

		rbFietsJa.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				bFiets = true;
				RadioButton rb = (RadioButton) event.getSource();
				VerticalPanel vp = (VerticalPanel) rb.getParent().getParent();

				pnFiets1.add(lblFietsPlaatsen);
				pnFiets1.add(txtFietsPlaatsen);
				vp.add(pnFiets1);
				
				vp.remove(5);
				
				pnCarpool3.add(b3);
				pnCarpool3.add(b4);
				vp.add(pnCarpool3);

			}
		});
		rbFietsNee.addClickHandler(new ClickHandler() {

			@Override
			public void onClick(ClickEvent event) {
				RadioButton rb = (RadioButton) event.getSource();
				VerticalPanel vp = (VerticalPanel) rb.getParent().getParent();
				if(bFiets){
					vp.remove(5);
				}

			}
		});
		
		hp.add(vp);
		return hp;
	}

	public HorizontalPanel nawP() {
		HorizontalPanel hp = new HorizontalPanel();

		pnlVTA.setSpacing(5);
		pnlVTA.add(lblVoornaam);
		pnlVTA.add(txtVoornaam);
		pnlVTA.add(lblDag);
		pnlVTA.add(lbDag);
		pnlVTA.add(lblWoonplaats);
		pnlVTA.add(txtWoonplaats);
		pnlVTA.add(lblStraatnaam);
		pnlVTA.add(txtStraatnaam);
		pnlVTA.add(lblTelefoonnummer);
		pnlVTA.add(txtTelefoonnummer);
		pnlButton.add(b1);
		pnlButton.add(b2);
		pnlVTA.add(pnlButton);

		pnlGeb.setSpacing(5);
		pnlGeb.add(lblTussenvoegsel);
		pnlGeb.add(txtTussenvoegsel);
		pnlGeb.add(lblMaand);
		pnlGeb.add(lbMaand);
		pnlGeb.add(lblPostcode);
		pnlGeb.add(txtPostcode);
		pnlGeb.add(lblHuisnummer);
		pnlGeb.add(txtHuisnummer);
		pnlGeb.add(lblEmail);
		pnlGeb.add(txtEmail);

		pnlStrHNr.setSpacing(5);
		pnlStrHNr.add(lblAchternaam);
		pnlStrHNr.add(txtAchternaam);
		pnlStrHNr.add(lblJaar);
		pnlStrHNr.add(lbJaar);

		hp.add(pnlVTA);
		hp.add(pnlGeb);
		hp.add(pnlStrHNr);
		return hp;
	}
	
	private void handleBoeking(){
		FieldVerifier fv = FieldVerifier.get();
		
		String nm = txtVoornaamB.getText();
		String tus = txtTussenvoegselB.getText();
		String an = txtAchternaamB.getText();
		String strn = txtStraatnaamB.getText();
		String hn = txtHuisnummerB.getText();
		String wp = txtWoonplaatsB.getText();
		String ps = txtPostcodeB.getText();
		String em = txtEmailB.getText();
		int tel = Integer.parseInt(txtTelefoonnummerB.getText());
		
		int gD = Integer.parseInt(txtDag.getText());
		int gM = Integer.parseInt(txtMaand.getText());
		int gJ = Integer.parseInt(txtJaar.getText());
		
		int zitPl = 0;
		int fPl = 0;
		
		if(rbJa.getValue()){
			a = true;
			zitPl = Integer.parseInt(txtZitplaatsen.getValue());
		}else if(rbNee.getValue()){
			a = false;
		}
		if(rbFietsJa.getValue()){
			f = rbFietsJa.getValue();
			fPl = Integer.parseInt(txtFietsPlaatsen.getValue());
		}
		if(rbFietsNee.getValue()){
			f = rbFietsNee.getValue();
		}	

		fv.addBoeking(deReis, nm, tus, an, strn, hn, wp, ps, em, tel, gD, gM, gJ, a, f, zitPl, fPl);
	}
	
	private void handleCarpool() {
		FieldVerifier fv = FieldVerifier.get();

		int b = 0; 
		//check
		if(rbJa.getValue()){
			b +=1;
			if(txtZitplaatsen.getText().matches("^[1-9]{1,1}$")){
				txtZitplaatsen.setStyleName("green-border");
				b +=1;
			}else{
				txtZitplaatsen.setStyleName("red-border");
			}
			
			if(rbFietsJa.getValue()){
				if(txtFietsPlaatsen.getText().matches("^[1-6]{1,1}$")){
					txtFietsPlaatsen.setStyleName("green-border");
					b +=1;
				}else{
					txtFietsPlaatsen.setStyleName("red-border");
				}
			}
			if(rbFietsNee.getValue()){
				b +=1;
			}
		}
		if(rbNee.getValue()){
			b += 5;
		}
		if(b == 3 || b == 5){
			tab1.remove(2);
			tab1.add(bevestigP(), "Bevestiging");
			tb.setTabEnabled(2, true);
			tab1.selectTab(2);
		}
		
	}

	private void handleGegevens(){

		FieldVerifier fv = FieldVerifier.get();

		int b = 0; 
		//check
		fv.checkField(txtVoornaam);
		fv.checkField(txtTussenvoegsel);
		fv.checkField(txtAchternaam);
		fv.checkField(txtStraatnaam);
		fv.checkField(txtHuisnummer);
		fv.checkField(txtWoonplaats);
		fv.checkField(txtPostcode);
		fv.checkField(txtEmail);
		fv.checkField(txtTelefoonnummer);

		//check naam
		if(txtVoornaam.getText().matches("^[A-Za-z]+$")) {
			txtVoornaam.setStyleName("green-border");
			b +=1;

		}else{
			txtVoornaam.setStyleName("red-border");
		}

		//check tussenvoegsel
		if(txtTussenvoegsel.getText().matches("^[A-Za-z]{0,6}$")){
			txtTussenvoegsel.setStyleName("green-border");		
			b +=1;
		}
		else{
			txtTussenvoegsel.setStyleName("red-border");
		}

		//check achternaam
		if(txtAchternaam.getText().matches("^[A-Za-z]+$")) {
			txtAchternaam.setStyleName("green-border");
			b +=1;
		}
		else{
			txtAchternaam.setStyleName("red-border");
		}

		//check straatnaam
		if(txtStraatnaam.getText().matches("^[A-Za-z ]+$")) {

			txtStraatnaam.setStyleName("green-border");
			b +=1;
		}
		else{
			txtStraatnaam.setStyleName("red-border");
		}

		//check huisnummer
		if(txtHuisnummer.getText().matches("^[0-9]{1,6}[a-zA-Z]{0,3}$")){
			txtHuisnummer.setStyleName("green-border");
			b +=1;
		}
		else{
			txtHuisnummer.setStyleName("red-border");
		}

		//check woonplaats
		if(txtWoonplaats.getText().matches("^[A-Za-z]+$")) {
			txtWoonplaats.setStyleName("green-border");
			b +=1;
		}
		else{
			txtWoonplaats.setStyleName("red-border");
		}
		//check postcode
		if(txtPostcode.getText().matches("^[1-9][0-9][0-9][0-9][A-Z][A-Z]$")){
			txtPostcode.setStyleName("green-border");
			b +=1;
		}
		else{
			txtPostcode.setStyleName("red-border");
		}

		//check email
		if(txtEmail.getText().matches("^[A-Za-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})$")){
			txtEmail.setStyleName("green-border");
			b +=1;
		}
		else{
			txtEmail.setStyleName("red-border");
		}

		//check telefoonnummer
		if(txtTelefoonnummer.getText().matches("^[0-9]{10}$")){
			txtTelefoonnummer.setStyleName("green-border");
			b +=1;
		}
		else{
			txtTelefoonnummer.setStyleName("red-border");
		}

		if(b == 9){
			tb.setTabEnabled(1, true);
			tab1.selectTab(1);
		}
		
	
		

	}
}

